/** 
 * JPanel das die ganzen Datenfelder fuer eine Zeitschrift bereitstellt
 * 
 * Datei: PanelZeitschrift.java        Autor: Simon Schindelmann 
 * Datum: 26.11.11                     Version: 0.1
 * 
 */
package medienverwaltung.simulation;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import GUI.Dashboard;
import personenverwaltung.Personenverwaltung;
import personenverwaltung.UngueltigesDatumAusnahme;
import medienverwaltung.Abmessung;
import medienverwaltung.DatumParser;
import medienverwaltung.KeinDatumFormat;
import medienverwaltung.Mediumverwalter;
import medienverwaltung.NameEnthaeltZahlenSonderzeichen;
import medienverwaltung.VergebeneISSNAusnahme;
import medienverwaltung.Zeitschrift;

public class PanelZeitschrift extends JPanel
{
  private static final long serialVersionUID = -8591431013783374215L;
  //Speichert die aktuelle Sprache die verwendet wird.
  private Uebersetzung uebersetzung = Uebersetzung.gibSprache ();
  private JButton hinzufuegen;
  private JLabel titel, datum, abmessungen, verlag, ausgabe, notiz,
      fachgebiet, sachgebiet, stichworte, umfang, beteiligt,
      issn, thema;
  private JTextField txt_titel, txt_datum, txt_abmessung_laenge,
      txt_abmessung_breite, txt_abmessung_hoehe, txt_verlag,
      txt_ausgabe, txt_notiz, txt_fachgebiet, txt_sachgebiet,
      txt_stichworte, txt_umfang, txt_beteiligt, txt_issn,
      txt_status, txt_thema;
  private Personenverwaltung per = new Personenverwaltung ();


  /**
   * Das Layout wird gesetzt und die Labels, Textfelder und Buttons 
   * werden initialisiert und dem JPanel hinzugefuegt.
   */
  public PanelZeitschrift ()
  {
    init ();
    setLayout (new GridLayout (8, 4));
    add (titel);
    add (txt_titel);
    add (datum);
    add (txt_datum);
    txt_datum.setText (uebersetzung.lokal
        .gibUebersetzung ("TT.MM.JJJJ"));
    add (abmessungen);
    add (txt_abmessung_laenge);
    txt_abmessung_laenge.setText (uebersetzung.lokal
        .gibUebersetzung ("laenge") + " mm");
    add (txt_abmessung_hoehe);
    txt_abmessung_hoehe.setText (uebersetzung.lokal
        .gibUebersetzung ("hoehe") + " mm");
    add (txt_abmessung_breite);
    txt_abmessung_breite.setText (uebersetzung.lokal
        .gibUebersetzung ("breite") + " mm");
    add (ausgabe);
    add (txt_ausgabe);
    add (verlag);
    add (txt_verlag);
    add (notiz);
    add (txt_notiz);
    add (fachgebiet);
    add (txt_fachgebiet);
    add (sachgebiet);
    add (txt_sachgebiet);
    add (stichworte);
    add (txt_stichworte);
    add (umfang);
    add (txt_umfang);
    add (thema);
    add (txt_thema);
    add (beteiligt);
    add (txt_beteiligt);
    add (issn);
    add (txt_issn);
    add (hinzufuegen, BorderLayout.EAST);
    txt_status.setEditable (false);
    add (txt_status);

  }


  /**
   * Hier werden die Labels, Textfelder, Buttons und ActionListener 
   * initialisiert.
   */
  public void init ()
  {
    titel = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Titel1") + "*: ");
    datum = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Datum") + "*: ");
    abmessungen = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Abmessung") + "*: ");
    verlag = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Verlag1") + ": ");
    ausgabe = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Ausgabe") + ": ");
    notiz = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Notizen") + ": ");
    fachgebiet = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Fachgebiet") + ": ");
    sachgebiet = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Sachgebiet") + ": ");
    stichworte = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Stichworte") + ": ");
    umfang = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Umfang") + ": ");
    beteiligt = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Beteiligte Personen")
        + ": ");
    issn = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("ISSN") + "*: ");
    thema = new JLabel ("  "
        + uebersetzung.lokal.gibUebersetzung ("Thema") + ": ");

    txt_titel = new JTextField ();
    txt_datum = new JTextField ();
    txt_abmessung_laenge = new JTextField ();
    txt_abmessung_breite = new JTextField ();
    txt_abmessung_hoehe = new JTextField ();
    txt_verlag = new JTextField ();
    txt_ausgabe = new JTextField ();
    txt_notiz = new JTextField ();
    txt_fachgebiet = new JTextField ();
    txt_sachgebiet = new JTextField ();
    txt_stichworte = new JTextField ();
    txt_umfang = new JTextField ();
    txt_beteiligt = new JTextField ();
    txt_issn = new JTextField ();
    txt_status = new JTextField ();
    txt_thema = new JTextField ();

    mouseListenerInit ();

    hinzufuegen = new JButton (uebersetzung.lokal
        .gibUebersetzung ("Zeitschrift Hinzufuegen"));
    
    hinzufuegen.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        try
        {
          hinzufuegen ();
        }
        catch (VergebeneISSNAusnahme e5)
        {
          JOptionPane.showMessageDialog (null, "" + e5.getMessage (),
              null, JOptionPane.WARNING_MESSAGE);
          txt_status.setBackground (Color.red);
          txt_status.setText ("");
        }
        catch (NameEnthaeltZahlenSonderzeichen e1)
        {
          JOptionPane.showMessageDialog (null, "" + e1.getMessage (),
              null, JOptionPane.WARNING_MESSAGE);
          txt_status.setBackground (Color.red);
          txt_status.setText ("");
        }
        catch (KeinDatumFormat e2)
        {
          JOptionPane.showMessageDialog (null, "" + e2.getMessage (),
              null, JOptionPane.WARNING_MESSAGE);
          txt_status.setBackground (Color.red);
          txt_status.setText ("");
        }
        catch (IllegalArgumentException e3)
        {
          JOptionPane.showMessageDialog (null, "" + e3.getMessage (),
              null, JOptionPane.WARNING_MESSAGE);
          txt_status.setBackground (Color.red);
          txt_status.setText ("");
        }
        catch (UngueltigesDatumAusnahme e4)
        {
          JOptionPane.showMessageDialog (null, "" + e4.getMessage (),
              null, JOptionPane.WARNING_MESSAGE);
          txt_status.setBackground (Color.red);
          txt_status.setText ("");
        }
      }
    });
  }


  /**
   * Hier werden die Textfelder ausgelesen und die Zeitschrift angelegt.
   * Wenn mindestens die Pflichtfelder richtig ausgefuehlt wurden.
   * Tritt ein Fehler auf wird die Farbe des Status Feld auf Rot 
   * gesetzt andernfalls auf Gruen und die TextFelder werden geleert.
   * @NameEnthaeltZahlen
   * @KeinDatumFormat Falls das Datum nicht dem Format entspricht.
   * @VergebeneISSNAusnahme wird geworfen wenn diese ISSN schon eine
   * andere Zeitschrift hat.
   */
  public void hinzufuegen () throws NameEnthaeltZahlenSonderzeichen,
      KeinDatumFormat, VergebeneISSNAusnahme
  {
    Abmessung a;
    int hoehe, laenge, breite;
    Zeitschrift m;
    Mediumverwalter mv = new Mediumverwalter ();
    if (txt_titel.getText ().isEmpty () == true
        || txt_datum.getText ().isEmpty () == true
        || txt_abmessung_laenge.getText ().isEmpty () == true
        || txt_abmessung_hoehe.getText ().isEmpty () == true
        || txt_abmessung_breite.getText ().isEmpty () == true
        || txt_issn.getText ().isEmpty () == true)
    {
      txt_status.setBackground (Color.red);
      txt_status.setText ("");
      JOptionPane.showMessageDialog (null, "" + uebersetzung.lokal
	  .gibUebersetzung ("Alle mit einem * markierten Felder " +
	  "muessen ausgefuellt werden"), null, JOptionPane
	  .WARNING_MESSAGE);
    }
    else
    {
      laenge = DatumParser.stringZuInteger (txt_abmessung_laenge
          .getText ());
      breite = DatumParser.stringZuInteger (txt_abmessung_breite
          .getText ());
      hoehe = DatumParser.stringZuInteger (txt_abmessung_hoehe
          .getText ());
      a = new Abmessung (laenge, hoehe, breite);

      m = new Zeitschrift (txt_titel.getText (), txt_datum.getText (),
          a, txt_issn.getText ());

      if (txt_notiz.getText ().isEmpty () == false)
      {
        m.notizHinzufuegen (txt_notiz.getText (), per
            .gibBenutzer (Dashboard.nutzerID ()));
      }

      if (txt_sachgebiet.getText ().isEmpty () == false)
      {
        m.setzeSachgebiet (txt_sachgebiet.getText ());
      }

      if (txt_fachgebiet.getText ().isEmpty () == false)
      {
        m.setzeFachgebiet (txt_fachgebiet.getText ());
      }

      if (txt_stichworte.getText ().isEmpty () == false)
      {
        m.stichwortHinzufuegen (txt_stichworte.getText ());
      }

      if (txt_umfang.getText ().isEmpty () == false)
      {
        m.setzeUmfang (txt_umfang.getText ());
      }

      if (txt_verlag.getText ().isEmpty () == false)
      {
        m.setzeVerlag (txt_verlag.getText ());
      }

      if (txt_ausgabe.getText ().isEmpty () == false)
      {
        m.setzeAusgabe (txt_ausgabe.getText ());
      }

      if (txt_thema.getText ().isEmpty () == false)
      {
        m.setzeThema (txt_thema.getText ());
      }

      if (txt_beteiligt.getText ().isEmpty () == false)
      {
        m.beteiligteHinzufuegen (txt_beteiligt.getText ());
      }

      mv = new Mediumverwalter ();
      mv.mediumHinzufuegen (m);
      txt_status.setBackground (Color.green);
      txt_status.setText ("ID: " + m.gibMediumId ());
      clear ();
    }
  }


  /**
   * Wenn das Anlegen einer Zeitschrift erfolgreich war, wird der Inhalt
   * der Textfelder entfernt.
   */
  public void clear ()
  {
    txt_titel.setText ("");
    txt_datum.setText (uebersetzung.lokal
        .gibUebersetzung ("TT.MM.JJJJ"));
    txt_abmessung_laenge.setText (uebersetzung.lokal
        .gibUebersetzung ("laenge") + " mm");
    txt_abmessung_breite.setText (uebersetzung.lokal
        .gibUebersetzung ("breite") + " mm");
    txt_abmessung_hoehe.setText (uebersetzung.lokal
        .gibUebersetzung ("hoehe") + " mm");
    txt_verlag.setText ("");
    txt_ausgabe.setText ("");
    txt_notiz.setText ("");
    txt_fachgebiet.setText ("");
    txt_sachgebiet.setText ("");
    txt_stichworte.setText ("");
    txt_umfang.setText ("");
    txt_beteiligt.setText ("");
    txt_issn.setText ("");
    txt_thema.setText ("");
  }


  /**
   * Die Methode initialisiert die MouseListener. Es wird fest gelegt 
   * das sich in einigen Textfeldern der Inhalt entfernen soll wenn rein
   * geklickt wird.
   */
  public void mouseListenerInit ()
  {
    txt_abmessung_laenge.addMouseListener (new MouseListener ()
    {
      public void mouseClicked (MouseEvent e)
      {
        txt_abmessung_laenge.setText ("");
      }


      @Override
      public void mouseEntered (MouseEvent e)
      {
      }


      @Override
      public void mouseExited (MouseEvent e)
      {
      }


      @Override
      public void mousePressed (MouseEvent e)
      {
      }


      @Override
      public void mouseReleased (MouseEvent e)
      {
      }
    });

    txt_abmessung_breite.addMouseListener (new MouseListener ()
    {
      public void mouseClicked (MouseEvent e)
      {
        txt_abmessung_breite.setText ("");
      }


      @Override
      public void mouseEntered (MouseEvent e)
      {
      }


      @Override
      public void mouseExited (MouseEvent e)
      {
      }


      @Override
      public void mousePressed (MouseEvent e)
      {
      }


      @Override
      public void mouseReleased (MouseEvent e)
      {
      }
    });

    txt_abmessung_hoehe.addMouseListener (new MouseListener ()
    {
      public void mouseClicked (MouseEvent e)
      {
        txt_abmessung_hoehe.setText ("");
      }


      @Override
      public void mouseEntered (MouseEvent e)
      {
      }


      @Override
      public void mouseExited (MouseEvent e)
      {
      }


      @Override
      public void mousePressed (MouseEvent e)
      {
      }


      @Override
      public void mouseReleased (MouseEvent e)
      {
      }
    });
    
    txt_datum.addMouseListener (new MouseListener ()
    {
      public void mouseClicked (MouseEvent e)
      {
        txt_datum.setText ("");
      }


      @Override
      public void mouseEntered (MouseEvent e)
      {
      }


      @Override
      public void mouseExited (MouseEvent e)
      {
      }


      @Override
      public void mousePressed (MouseEvent e)
      {
      }


      @Override
      public void mouseReleased (MouseEvent e)
      {
      }
    });
  }
}
